package com.maochang.top.dynamic_agent.proxy;


import com.maochang.top.dynamic_agent.inter.Calculator;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 帮Calculator.java生成代理对象的类
 */
public class CalculatorProxy {
    /**
     * @param calculator 被代理对象（宝宝）
     * 返回的:哲哲
     */
    public static Calculator getProxy(final Calculator calculator) {
        //当前被代理对象的类加载器
        ClassLoader classLoader=calculator.getClass().getClassLoader();
        //当前被代理对象所实现的所有接口
        Class<?>[] interfaces=calculator.getClass().getInterfaces();
        //方法执行器,帮我们执行目标对象执行目标方法（被代理对象）
        InvocationHandler invocationHandler=new InvocationHandler() {
            /**
             * @param proxy   代理对象:是给jdk使用的,任何时候不要动这个对象
             * @param method  当前将要执行的目标对象(代理对象)的方法
             * @param args    方法的参数
             * @return
             * @throws Throwable
             * 代理方法执行add 是会先走这 然后 在调用目标方法的 add方法
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //利用反射执行目标方法
                //目标方法执行后的返回值
                System.out.println(method+"抽象方法");
                System.out.println("这是动态代理将要帮你执行方法---前");
                Object invoke = method.invoke(calculator, args);
                //返回值必须返回出去,外界才能拿到真正执行后的返回值
                System.out.println("这是动态代理将要帮你执行方法---后");
                //System.out.println(invoke);
                return invoke;
            }
        };
        //Proxy为目标对象创建代理对象
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
        Calculator calculator1=(Calculator) o;
        return calculator1;
    }
}
